package com.atguigu.starter.config;

import com.atguigu.starter.service.AgeService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration

// 使用条件注解，让当前配置类仅在 AgeService 存在时才加入 IoC 容器
// OnClass 表示注解中 value 属性指定的类存在于当前类路径下，换句话说也就是必须导入 AgeService 依赖才会把当前自动配置类加入 IoC 容器
// 为什么要给自动配置类标记条件注解？
// 答：SpringBoot 体系中各种 starter 很多，每个 starter 都有自己的自动配置类，这些自动配置类全部都加入 IoC 容器没有必要，应该是用哪个加哪个最好
@ConditionalOnClass(value = AgeService.class)

// 开启 ConfigurationProperties 功能并加载属性组件
@EnableConfigurationProperties(value = AgeProperties.class)
public class AgeAutoConfiguration {

    private AgeProperties ageProperties;

    public AgeAutoConfiguration(AgeProperties ageProperties) {
        this.ageProperties = ageProperties;
    }

    // Missing 单词：丢失、遗漏、找不到
    // MissingBean 单词：IoC 容器中没有这个 bean
    // @ConditionalOnMissingBean 条件注解：当 IoC 容器中没有 AgeService 这个 bean 时，才把当前方法返回的对象加入 IoC 容器
    // 提问：IoC 容器中为啥会有 AgeService 这个 bean 呢？
    // 答：开发人员有可能自己把它加入 IoC 容器
    @ConditionalOnMissingBean
    @Bean
    public AgeService getAgeService() {
        return new AgeService(ageProperties.getBirthday());
    }

}
